Les nombres dyadiques

Représentation approximative des nombres réels

Nombre décimaux

Un nombre décimal est un nombre s'écrivant sous la forme `\frac{x}{10^{n}`, où $x$ est un entier relatif.

Nombre dyadiques

Par analogie avec les nombres décimaux, on appelle nombres dyadiques les nombres qui s'écrivent sous la forme `\frac{x}{2^{n}}`, avec $x$ entier relatif et $n$ entier.

Développement dyadique d'un nombre dyadique

On appelle développement dyadique d'un nombre dyadique l'écriture en binaire de ce nombre.

Ce développement dyadique est l'écriture en base 2 d'un nombre dyadique.

Ecriture binaire d'un nombre dyadique

Pour obtenir le développement dyadique d'un nombre dyadique `\frac{x}{2^{n}`, on prend le nombre binaire correspondant à $x$ et on insère une virgule avant le n-ième bit en partant de la fin.

Ecrivons le développement dyadique de $2,5$.

  1. $2,5$ est un nombre dyadique puisque $2,5=\frac{5}{2}=\frac{5}{2^1}$. Donc on peut écrire son développement dyadique.
  2. On détermine l'écriture en binaire de $5$ :$5_{10}=101_{2}$
  3. On insère une virgule avant le n-ième bit en partant de la fin.$2,5_{10}=10,1_{2}$

Ecrire le développement dyadique de $31,25$

Code de déblocage de la correction :

Cette méthode est fastidieuse parce qu'elle oblige de passer par l'écriture dyadique. De plus que faire des nombres qui ne sont pas dyadiques?

De l'écriture décimale à la notation binaire

Partons tout de suite sur un exemple : comment représenter 5,1875 en binaire ?

Il nous faut déjà représenter 5, ça, pas de problème : 101

Comment représenter le ",1875" ?

On obtient une succession de "a + 0,b" ("0 + 0,375", "0 + 0,75", "1 + 0,5" et "1 + 0,0"). Il suffit maintenant de "prendre" tous les "a" (dans l'ordre de leur obtention) afin d'obtenir la partie décimale de notre nombre : 0011

Nous avons (101,0011)2 qui est la représentation binaire de (5,1875)10

Trouvez la représentation binaire de :

  1. (4,125)10
  2. (7,09375)10
  3. (13,325)10

Code de déblocage de la correction :

De l'écriture binaire à la notation décimale

Il est possible de retrouver une représentation décimale en base 10 à partir d'une représentation en binaire.

Partons de (100,0101)2

Pas de problème pour la partie entière, nous obtenons "4".

Pour la partie décimale nous devons écrire : 0 x 2-1 + 1 x 2-2 + 0 x 2-3 + 1 x 2-4 = 0,3125.

Nous avons donc (4,3125)10

Trouvez la représentation décimale de : (100,001)2

Code de déblocage de la correction :

Représentation grâce aux puissances

En base dix, il est possible d'écrire les très grands nombres et les très petits nombres grâce aux "puissances de dix" (exemples 6,02.1023 ou 6,67.10-11). Il est possible de faire exactement la même chose avec une représentation binaire, puisque nous sommes en base 2, nous utiliserons des "puissances de deux" à la place des "puissances dix" (exemple 101,1101.210).

Pour passer d'une écriture sans "puissance de deux" à une écriture avec "puissance de deux", il suffit décaler la virgule : 1101,1001 = 1,1011001.211 pour passer de "1101,1001" à "1,1011001" nous avons décalé la virgule de 3 rangs vers la gauche d'où le "211" (attention de ne pas oublier que nous travaillons en base 2 le "11" correspond bien à un décalage de 3 rangs de la virgule, car (11) 2=(3)10).

Si l'on désire décaler la virgule vers la gauche, il va être nécessaire d'utiliser des "puissances de deux négatives" 0,0110 = 1,10.2-10, nous décalons la virgule de 2 rangs vers la droite, d'où le "-10"

Pour compléter ce cours, vous pouvez faire une recherche sur le norme IEEE-754 qui n'est pas au programme

Trouvez la représentation binaire de : (0,1)10

Que remarquez-vous ?

Code de déblocage de la correction :

Il existe des nombres décimaux qui ne sont pas dyadiques. Ils n'acceptent pas de développement dyadique fini. Par conséquent leur représentation machine sera nécessairement tronquée. Cela engendrera des erreurs dans les opérations.

Il existe une anecdote illustrant ce problème:

Il ne faudrait surtout pas croire que ces petites erreurs de calcul et d’arrondi soient négligeables, et l’anecdote suivante devrait vous convaincre de l’importance qu’il y a à en prendre conscience. Le 25 février 1991, à Dharan en Arabie Saoudite, un missile Patriot américain a raté l’interception d’un missile Scud irakien, ce dernier provoquant la mort de 28 personnes. La commission d’enquête chargée de comprendre la raison de cet échec a mis en évidence le défaut suivant : L’horloge interne du missile Patriot mesure le temps en 1/10s. Pour obtenir le temps en seconde, le système multiplie ce nombre par 10 en utilisant un registre de 24 bits en virgule fixe. Or 1/10 n’est pas un nombre dyadique donc a été arrondi : le registre de 24 bits contient `0,00011001100110011001100_2` et induit une erreur binaire de `0,0000000000000000000000011001100..._2`, soit approximativement 0,000000095 en notation décimale. En multipliant cette quantité par le nombre de 1/10s pendant 100h (le temps écoulé entre la mise en marche du système et le lancement du missile Patriot), on obtient le décalage entre l’horloge interne de missile et le temps réel, soit : 0,000000095 × 100 × 3600 × 10 ≈ 0,34s. Or un missile Scud vole à la vitesse approximative de 1,676m/s donc parcourt plus de 500m en 0,34s, ce qui le fait largement sortir de la zone d’acquisition de sa cible par le missile d’interception 7

Cette anecdote est tirée d'un site intéressant : catastrophes numériques

  1. Ecrire en premier lieu une fonction decbin(n) qui à un entier n renvoie sa décomposition en binaire sous forme de liste.
  2. Ecrire en python une fonction deci_en_bin(n) qui a un nombre décimal n renvoie son écriture binaire sur 24 bits sous la forme d'une liste. La virgule sera une chaine de caractère.

Code de déblocage de la correction :

  1. Ecrire une fonction bindec(l) qui a une liste de correspondant à l'écriture en binaire d'un nombre renvoie le nombre codé en décimal.
  2. Ecrire une fonction recherche_de_position(l) qui a une liste de longueur 24 renvoie la position du caractère , ou True si le caractère n'est pas présent.
  3. Ecrire en python une fonction bin_en_deci(l) qui a un nombre en binaire l écrit sur 24 bits sous la forme d'une liste renvoie le décimal en base 10 correspondant.

Code de déblocage de la correction :

Licence Creative Commons
Les différents auteurs mettent l'ensemble du site à disposition selon les termes de la licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International